| @@ -9,7 +9,8 @@ from django_response import response | ||
| 9 | 9 | from paginator import pagination | 
| 10 | 10 |  | 
| 11 | 11 | from account.models import UserInfo | 
| 12 | -from member.models import (CouponInfo, GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo, | |
| 12 | +from coupon.models import UserCouponInfo | |
| 13 | +from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo, | |
| 13 | 14 | MemberActivitySignupInfo, RightInfo) | 
| 14 | 15 | from utils.error.errno_utils import (MemberActivityStatusCode, MemberGoodStatusCode, MemberRightStatusCode, | 
| 15 | 16 | UserStatusCode) | 
| @@ -215,7 +216,7 @@ def coupons(request): | ||
| 215 | 216 |      page = request.POST.get('page', 1) | 
| 216 | 217 |      num = request.POST.get('num', 20) | 
| 217 | 218 |  | 
| 218 | -    coupons = CouponInfo.objects.filter(user_id=user_id, status=True).order_by('-pk') | |
| 219 | +    coupons = UserCouponInfo.objects.filter(user_id=user_id, status=True).order_by('-pk') | |
| 219 | 220 | coupons, left = pagination(coupons, page, num) | 
| 220 | 221 | coupons = [coupon.data for coupon in coupons] | 
| 221 | 222 |  | 
| @@ -8,7 +8,8 @@ from django_six import CompatibilityBaseCommand, close_old_connections | ||
| 8 | 8 | from TimeConvert import TimeConvert as tc | 
| 9 | 9 |  | 
| 10 | 10 | from account.models import UserInfo | 
| 11 | -from member.models import CouponInfo, RightInfo | |
| 11 | +from coupon.models import UserCouponInfo | |
| 12 | +from member.models import RightInfo | |
| 12 | 13 | from utils.redis.connect import r | 
| 13 | 14 | from utils.redis.rkeys import MEMBER_SEND_COUPON_LIST | 
| 14 | 15 |  | 
| @@ -46,29 +47,35 @@ class Command(CompatibilityBaseCommand): | ||
| 46 | 47 | rights = RightInfo.objects.filter(is_send_coupon=True, status=True) | 
| 47 | 48 | for right in rights: | 
| 48 | 49 | if user.level == UserInfo.MEMBER_LRC: | 
| 49 | - coupon_amount = right.coupon_level1_amount | |
| 50 | + coupon_id = right.coupon_level1_id | |
| 50 | 51 | elif user.level == UserInfo.MEMBER_SILVER: | 
| 51 | - coupon_amount = right.coupon_level2_amount | |
| 52 | + coupon_id = right.coupon_level2_id | |
| 52 | 53 | elif user.level == UserInfo.MEMBER_SILVER: | 
| 53 | - coupon_amount = right.coupon_level3_amount | |
| 54 | + coupon_id = right.coupon_level3_id | |
| 54 | 55 | elif user.level == UserInfo.MEMBER_SILVER: | 
| 55 | - coupon_amount = right.coupon_level4_amount | |
| 56 | + coupon_id = right.coupon_level4_id | |
| 56 | 57 | else: | 
| 57 | - coupon_amount = right.coupon_level5_amount | |
| 58 | + coupon_id = right.coupon_level5_id | |
| 59 | + | |
| 60 | + try: | |
| 61 | + coupon = UserCouponInfo.objects.get(coupon_id=coupon_id) | |
| 62 | + except UserCouponInfo.DoesNotExist: | |
| 63 | + continue | |
| 64 | + | |
| 58 | 65 | for _ in xrange(right.coupon_num): | 
| 59 | - CouponInfo.objects.create( | |
| 66 | + UserCouponInfo.objects.create( | |
| 67 | + brand_id=coupon.brand_id, | |
| 68 | + brand_name=coupon.brand_name, | |
| 69 | + coupon_id=coupon_id, | |
| 60 | 70 | user_id=user_id, | 
| 61 | - coupon_valid_period=right.coupon_valid_period, | |
| 62 | - coupon_amount=coupon_amount, | |
| 63 | - coupon_detail=right.coupon_detail, | |
| 71 | + coupon_title=coupon.coupon_title, | |
| 72 | + coupon_detail=coupon.coupon_detail, | |
| 73 | + coupon_value=coupon.coupon_value, | |
| 74 | + coupon_image=coupon.coupon_image, | |
| 64 | 75 | active_at=tc.utc_datetime(), | 
| 65 | 76 | expire_at=tc.utc_datetime(days=365), | 
| 66 | - right_id=right.right_id, | |
| 67 | - right_type=right.right_type, | |
| 68 | - icon=right.icon, | |
| 69 | - title=right.title, | |
| 70 | - subtitle=right.subtitle, | |
| 71 | - detail=right.detail, | |
| 77 | + coupon_valid_period=coupon.coupon_valid_period, | |
| 78 | + coupon_limit_brand_ids=coupon.coupon_limit_brand_ids, | |
| 72 | 79 | ) | 
| 73 | 80 |  | 
| 74 | 81 | close_old_connections() | 
| @@ -2,27 +2,14 @@ | ||
| 2 | 2 |  | 
| 3 | 3 | from django.contrib import admin | 
| 4 | 4 |  | 
| 5 | -from coupon.models import CouponInfo | |
| 5 | +from coupon.models import CouponInfo, UserCouponInfo | |
| 6 | 6 | from mch.models import ActivityInfo | 
| 7 | 7 | from member.models import RightInfo | 
| 8 | 8 |  | 
| 9 | 9 |  | 
| 10 | 10 | class CouponInfoAdmin(admin.ModelAdmin): | 
| 11 | -    list_display = ('coupon_id', 'coupon_expire_type', 'coupon_valid_period', 'coupon_expire_at', 'coupon_value', 'coupon_num', 'coupon_level1_amount', 'coupon_level2_amount', 'coupon_level3_amount', 'coupon_level4_amount', 'coupon_level5_amount', 'coupon_detail', 'status', 'created_at', 'updated_at') | |
| 11 | +    list_display = ('brand_id', 'brand_name', 'coupon_id', 'coupon_title', 'coupon_value', 'coupon_expire_type', 'coupon_valid_period', 'coupon_expire_at', 'status', 'created_at', 'updated_at') | |
| 12 | 12 |      readonly_fields = ('coupon_id', 'created_at', 'updated_at') | 
| 13 | - fieldsets = ( | |
| 14 | -        (u'', { | |
| 15 | -            'fields': ('coupon_id', 'status', 'created_at', 'updated_at') | |
| 16 | - }), | |
| 17 | -        (u'活动券信息', { | |
| 18 | -            'classes': ('collapse', ), | |
| 19 | -            'fields': ('coupon_expire_type', 'coupon_valid_period', 'coupon_expire_at', 'coupon_value') | |
| 20 | - }), | |
| 21 | -        (u'会员券信息', { | |
| 22 | -            'classes': ('collapse', ), | |
| 23 | -            'fields': ('coupon_num', 'coupon_level1_amount', 'coupon_level2_amount', 'coupon_level3_amount', 'coupon_level4_amount', 'coupon_level5_amount', 'coupon_detail') | |
| 24 | - }), | |
| 25 | - ) | |
| 26 | 13 |  | 
| 27 | 14 | def save_model(self, request, obj, form, change): | 
| 28 | 15 | obj.save() | 
| @@ -30,4 +17,10 @@ class CouponInfoAdmin(admin.ModelAdmin): | ||
| 30 | 17 | # TODO: Update ActivityInfo/RightInfo | 
| 31 | 18 |  | 
| 32 | 19 |  | 
| 20 | +class UserCouponInfoAdmin(admin.ModelAdmin): | |
| 21 | +    list_display = ('brand_id', 'brand_name', 'coupon_id', 'user_id', 'coupon_title', 'coupon_value', 'active_at', 'expire_at', 'coupon_valid_period', 'coupon_limit_brand_ids', 'has_used', 'admin_id', 'used_at', 'status', 'created_at', 'updated_at') | |
| 22 | +    list_filter = ('has_used', 'status') | |
| 23 | + | |
| 24 | + | |
| 33 | 25 | admin.site.register(CouponInfo, CouponInfoAdmin) | 
| 26 | +admin.site.register(UserCouponInfo, UserCouponInfoAdmin) | 
| @@ -0,0 +1,56 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2019-12-21 07:34 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | +import django_models_ext.fileext | |
| 7 | +import jsonfield.fields | |
| 8 | + | |
| 9 | + | |
| 10 | +class Migration(migrations.Migration): | |
| 11 | + | |
| 12 | + dependencies = [ | |
| 13 | +        ('coupon', '0001_initial'), | |
| 14 | + ] | |
| 15 | + | |
| 16 | + operations = [ | |
| 17 | + migrations.RemoveField( | |
| 18 | + model_name='couponinfo', | |
| 19 | + name='coupon_level1_amount', | |
| 20 | + ), | |
| 21 | + migrations.RemoveField( | |
| 22 | + model_name='couponinfo', | |
| 23 | + name='coupon_level2_amount', | |
| 24 | + ), | |
| 25 | + migrations.RemoveField( | |
| 26 | + model_name='couponinfo', | |
| 27 | + name='coupon_level3_amount', | |
| 28 | + ), | |
| 29 | + migrations.RemoveField( | |
| 30 | + model_name='couponinfo', | |
| 31 | + name='coupon_level4_amount', | |
| 32 | + ), | |
| 33 | + migrations.RemoveField( | |
| 34 | + model_name='couponinfo', | |
| 35 | + name='coupon_level5_amount', | |
| 36 | + ), | |
| 37 | + migrations.RemoveField( | |
| 38 | + model_name='couponinfo', | |
| 39 | + name='coupon_num', | |
| 40 | + ), | |
| 41 | + migrations.AddField( | |
| 42 | + model_name='couponinfo', | |
| 43 | + name='coupon_image', | |
| 44 | + field=models.ImageField(blank=True, help_text='\u5238\u56fe\u7247', null=True, upload_to=django_models_ext.fileext.upload_path, verbose_name='coupon_image'), | |
| 45 | + ), | |
| 46 | + migrations.AddField( | |
| 47 | + model_name='couponinfo', | |
| 48 | + name='coupon_limit_brand_ids', | |
| 49 | + field=jsonfield.fields.JSONField(blank=True, help_text='\u5238\u9650\u5236\u4f7f\u7528 brand_ids', null=True, verbose_name='coupon_limit_brand_ids'), | |
| 50 | + ), | |
| 51 | + migrations.AddField( | |
| 52 | + model_name='couponinfo', | |
| 53 | + name='coupon_title', | |
| 54 | + field=models.CharField(blank=True, help_text='\u5238\u6807\u9898', max_length=255, null=True, verbose_name='coupon_title'), | |
| 55 | + ), | |
| 56 | + ] | 
| @@ -0,0 +1,55 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2019-12-21 08:13 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | +import jsonfield.fields | |
| 7 | +import shortuuidfield.fields | |
| 8 | +import simditor.fields | |
| 9 | + | |
| 10 | + | |
| 11 | +class Migration(migrations.Migration): | |
| 12 | + | |
| 13 | + dependencies = [ | |
| 14 | +        ('coupon', '0002_auto_20191221_1534'), | |
| 15 | + ] | |
| 16 | + | |
| 17 | + operations = [ | |
| 18 | + migrations.CreateModel( | |
| 19 | + name='UserCouponInfo', | |
| 20 | + fields=[ | |
| 21 | +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | |
| 22 | +                ('status', models.BooleanField(db_index=True, default=True, help_text='Status', verbose_name='status')), | |
| 23 | +                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')), | |
| 24 | +                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')), | |
| 25 | +                ('brand_id', models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id')), | |
| 26 | +                ('brand_name', models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name')), | |
| 27 | +                ('coupon_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=22, null=True, unique=True)), | |
| 28 | +                ('user_id', models.CharField(blank=True, db_index=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='user_id')), | |
| 29 | +                ('coupon_title', models.CharField(blank=True, help_text='\u5238\u6807\u9898', max_length=255, null=True, verbose_name='coupon_title')), | |
| 30 | +                ('coupon_detail', simditor.fields.RichTextField(blank=True, help_text='\u5238\u8be6\u60c5', null=True, verbose_name='coupon_detail')), | |
| 31 | +                ('coupon_value', models.IntegerField(blank=True, default=0, help_text='\u5238\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_value')), | |
| 32 | +                ('active_at', models.DateTimeField(blank=True, help_text='\u751f\u6548\u65f6\u95f4', null=True, verbose_name='active_at')), | |
| 33 | +                ('expire_at', models.DateTimeField(blank=True, help_text='\u8fc7\u671f\u65f6\u95f4', null=True, verbose_name='expire_at')), | |
| 34 | +                ('coupon_valid_period', models.IntegerField(default=0, help_text='\u5238\u6709\u6548\u65f6\u95f4\uff08\u5355\u4f4d\uff1a\u5929\uff09', verbose_name='coupon_valid_period')), | |
| 35 | +                ('coupon_limit_brand_ids', jsonfield.fields.JSONField(blank=True, help_text='\u5238\u9650\u5236\u4f7f\u7528 brand_ids', null=True, verbose_name='coupon_limit_brand_ids')), | |
| 36 | +                ('has_used', models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u5df2\u6838\u9500', verbose_name='has_used')), | |
| 37 | +                ('admin_id', models.CharField(blank=True, db_index=True, help_text='\u6838\u9500\u5458\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='admin_id')), | |
| 38 | +                ('used_at', models.DateTimeField(blank=True, help_text='\u7ef4\u4fee\u5238\u6838\u9500\u65f6\u95f4', null=True, verbose_name='used_at')), | |
| 39 | + ], | |
| 40 | +            options={ | |
| 41 | + 'verbose_name': '\u7528\u6237\u5238\u4fe1\u606f', | |
| 42 | + 'verbose_name_plural': '\u7528\u6237\u5238\u4fe1\u606f', | |
| 43 | + }, | |
| 44 | + ), | |
| 45 | + migrations.AddField( | |
| 46 | + model_name='couponinfo', | |
| 47 | + name='brand_id', | |
| 48 | + field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'), | |
| 49 | + ), | |
| 50 | + migrations.AddField( | |
| 51 | + model_name='couponinfo', | |
| 52 | + name='brand_name', | |
| 53 | + field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'), | |
| 54 | + ), | |
| 55 | + ] | 
| @@ -2,8 +2,10 @@ | ||
| 2 | 2 |  | 
| 3 | 3 | from django.db import models | 
| 4 | 4 | from django.utils.translation import ugettext_lazy as _ | 
| 5 | -from django_models_ext import BaseModelMixin | |
| 5 | +from django_models_ext import BaseModelMixin, upload_file_path, upload_file_url, upload_path | |
| 6 | +from jsonfield import JSONField | |
| 6 | 7 | from shortuuidfield import ShortUUIDField | 
| 8 | +from TimeConvert import TimeConvert as tc | |
| 7 | 9 |  | 
| 8 | 10 | from simditor.fields import RichTextField | 
| 9 | 11 |  | 
| @@ -17,22 +19,21 @@ class CouponInfo(BaseModelMixin): | ||
| 17 | 19 | (CHANGED_EXPIRED_TIME, u'可变结束时间'), | 
| 18 | 20 | ) | 
| 19 | 21 |  | 
| 22 | + brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 23 | + brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 24 | + | |
| 20 | 25 | coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True) | 
| 21 | 26 |  | 
| 22 | - # 活动券信息 | |
| 27 | + coupon_title = models.CharField(_(u'coupon_title'), max_length=255, blank=True, null=True, help_text=u'券标题') | |
| 28 | + coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') | |
| 29 | + coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=_(u'维修券金额(单位:分)')) | |
| 30 | + coupon_image = models.ImageField(_(u'coupon_image'), upload_to=upload_path, blank=True, null=True, help_text=u'券图片') | |
| 31 | + | |
| 23 | 32 | coupon_expire_type = models.IntegerField(_(u'coupon_expire_type'), choices=COUPON_EXPIRED_TIME_TUPLE, default=FIXED_EXPIRED_TIME, help_text=_(u'维修券类型')) | 
| 24 | 33 | coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'维修券有效时间(单位:天)')) | 
| 25 | 34 | coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=_(u'维修券过期时间')) | 
| 26 | - coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=_(u'维修券金额(单位:分)')) | |
| 27 | 35 |  | 
| 28 | - # 会员券信息 | |
| 29 | - coupon_num = models.IntegerField(_(u'coupon_num'), default=0, help_text=_(u'券每会员级别发放张数')) | |
| 30 | - coupon_level1_amount = models.IntegerField(_(u'coupon_level1_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 31 | - coupon_level2_amount = models.IntegerField(_(u'coupon_level2_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 32 | - coupon_level3_amount = models.IntegerField(_(u'coupon_level3_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 33 | - coupon_level4_amount = models.IntegerField(_(u'coupon_level4_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 34 | - coupon_level5_amount = models.IntegerField(_(u'coupon_level5_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 35 | - coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') | |
| 36 | + coupon_limit_brand_ids = JSONField(_(u'coupon_limit_brand_ids'), blank=True, null=True, help_text=u'券限制使用 brand_ids') | |
| 36 | 37 |  | 
| 37 | 38 | class Meta: | 
| 38 | 39 | verbose_name = _(u'券信息') | 
| @@ -40,3 +41,59 @@ class CouponInfo(BaseModelMixin): | ||
| 40 | 41 |  | 
| 41 | 42 | def __unicode__(self): | 
| 42 | 43 | return unicode(self.pk) | 
| 44 | + | |
| 45 | + | |
| 46 | +class UserCouponInfo(BaseModelMixin): | |
| 47 | + brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 48 | + brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 49 | + | |
| 50 | + coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True) | |
| 51 | + user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) | |
| 52 | + | |
| 53 | + coupon_title = models.CharField(_(u'coupon_title'), max_length=255, blank=True, null=True, help_text=u'券标题') | |
| 54 | + coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') | |
| 55 | + coupon_value = models.IntegerField(_(u'coupon_value'), default=0, blank=True, null=True, help_text=u'券金额(单位:分)') | |
| 56 | + coupon_image = models.ImageField(_(u'coupon_image'), upload_to=upload_path, blank=True, null=True, help_text=u'券图片') | |
| 57 | + | |
| 58 | + active_at = models.DateTimeField(_(u'active_at'), blank=True, null=True, help_text=_(u'生效时间')) | |
| 59 | + expire_at = models.DateTimeField(_(u'expire_at'), blank=True, null=True, help_text=_(u'过期时间')) | |
| 60 | + coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)')) | |
| 61 | + | |
| 62 | + coupon_limit_brand_ids = JSONField(_(u'coupon_limit_brand_ids'), blank=True, null=True, help_text=u'券限制使用 brand_ids') | |
| 63 | + | |
| 64 | + has_used = models.BooleanField(_(u'has_used'), default=False, help_text=u'是否已核销', db_index=True) | |
| 65 | + admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True) | |
| 66 | + used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=u'维修券核销时间') | |
| 67 | + | |
| 68 | + class Meta: | |
| 69 | + verbose_name = _(u'用户券信息') | |
| 70 | + verbose_name_plural = _(u'用户券信息') | |
| 71 | + | |
| 72 | + def __unicode__(self): | |
| 73 | + return unicode(self.pk) | |
| 74 | + | |
| 75 | + @property | |
| 76 | + def coupon_image(self): | |
| 77 | + return upload_file_path(self.coupon_image) | |
| 78 | + | |
| 79 | + @property | |
| 80 | + def coupon_image_url(self): | |
| 81 | + return upload_file_url(self.coupon_image) | |
| 82 | + | |
| 83 | + @property | |
| 84 | + def data(self): | |
| 85 | +        return { | |
| 86 | + 'coupon_id': self.coupon_id, | |
| 87 | + 'coupon_title': self.coupon_title, | |
| 88 | + 'coupon_detail': self.coupon_detail, | |
| 89 | + 'coupon_amount': self.coupon_value, | |
| 90 | + 'coupon_value': self.coupon_value, | |
| 91 | + 'coupon_image_url': self.coupon_image_url, | |
| 92 | + 'active_at': tc.local_string(self.active_at, format='%Y%m%d'), | |
| 93 | + 'expire_at': tc.local_string(self.expire_at, format='%Y%m%d'), | |
| 94 | + 'coupon_valid_period': self.coupon_valid_period, | |
| 95 | + 'coupon_limit_brand_ids': self.coupon_limit_brand_ids, | |
| 96 | + 'has_used': self.has_used, | |
| 97 | + 'admin_id': self.admin_id, | |
| 98 | + 'used_at': self.used_at, | |
| 99 | + } | 
| @@ -2,13 +2,13 @@ | ||
| 2 | 2 |  | 
| 3 | 3 | from django.contrib import admin | 
| 4 | 4 |  | 
| 5 | -from member.models import (CouponInfo, GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo, | |
| 5 | +from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo, | |
| 6 | 6 | MemberActivitySignupInfo, RightInfo, ShotTypeInfo) | 
| 7 | 7 | from utils.redis.rshot import update_member_shot_data | 
| 8 | 8 |  | 
| 9 | 9 |  | 
| 10 | 10 | class GoodsInfoAdmin(admin.ModelAdmin): | 
| 11 | -    list_display = ('good_id', 'good_type', 'title', 'desc', 'image', 'is_slider', 'slider_image', 'integral', 'fee', 'minlevel', 'only_for_member', 'position', 'status', 'created_at', 'updated_at') | |
| 11 | +    list_display = ('good_id', 'good_type', 'title', 'value', 'left_num', 'coupon_id', 'image', 'is_slider', 'slider_image', 'integral', 'fee', 'minlevel', 'only_for_member', 'position', 'status', 'created_at', 'updated_at') | |
| 12 | 12 |      list_filter = ('good_type', 'is_slider', 'only_for_member', 'status') | 
| 13 | 13 |  | 
| 14 | 14 |  | 
| @@ -28,7 +28,7 @@ class GoodsOrderInfoAdmin(admin.ModelAdmin): | ||
| 28 | 28 |  | 
| 29 | 29 |  | 
| 30 | 30 | class RightInfoAdmin(admin.ModelAdmin): | 
| 31 | -    list_display = ('right_id', 'right_type', 'icon', 'title', 'subtitle', 'detail', 'level1', 'level2', 'level3', 'level4', 'level5', 'minlevel', 'position', 'is_send_coupon', 'coupon_valid_period', 'coupon_num', 'status', 'created_at', 'updated_at') | |
| 31 | +    list_display = ('right_id', 'right_type', 'icon', 'title', 'subtitle', 'detail', 'level1', 'level2', 'level3', 'level4', 'level5', 'minlevel', 'position', 'is_send_coupon', 'coupon_num', 'coupon_level1_id', 'coupon_level2_id', 'coupon_level3_id', 'status', 'created_at', 'updated_at') | |
| 32 | 32 |      list_filter = ('right_type', 'is_send_coupon', 'status') | 
| 33 | 33 |  | 
| 34 | 34 | def save_model(self, request, obj, form, change): | 
| @@ -37,11 +37,6 @@ class RightInfoAdmin(admin.ModelAdmin): | ||
| 37 | 37 | # TODO: Update coupon relative | 
| 38 | 38 |  | 
| 39 | 39 |  | 
| 40 | -class CouponInfoAdmin(admin.ModelAdmin): | |
| 41 | -    list_display = ('coupon_id', 'user_id', 'coupon_valid_period', 'coupon_amount', 'coupon_detail', 'active_at', 'expire_at', 'right_id', 'right_type', 'icon', 'title', 'subtitle', 'detail', 'status', 'created_at', 'updated_at') | |
| 42 | -    list_filter = ('right_type', 'status') | |
| 43 | - | |
| 44 | - | |
| 45 | 40 | class ShotTypeInfoAdmin(admin.ModelAdmin): | 
| 46 | 41 |      list_display = ('shot_type_id', 'shot_type_name', 'position', 'status', 'created_at', 'updated_at') | 
| 47 | 42 |  | 
| @@ -74,7 +69,6 @@ class MemberActivitySigninInfoAdmin(admin.ModelAdmin): | ||
| 74 | 69 | admin.site.register(GoodsInfo, GoodsInfoAdmin) | 
| 75 | 70 | admin.site.register(GoodsOrderInfo, GoodsOrderInfoAdmin) | 
| 76 | 71 | admin.site.register(RightInfo, RightInfoAdmin) | 
| 77 | -admin.site.register(CouponInfo, CouponInfoAdmin) | |
| 78 | 72 | admin.site.register(ShotTypeInfo, ShotTypeInfoAdmin) | 
| 79 | 73 | admin.site.register(MemberActivityInfo, MemberActivityInfoAdmin) | 
| 80 | 74 | admin.site.register(MemberActivitySignupInfo, MemberActivitySignupInfoAdmin) | 
| @@ -0,0 +1,90 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2019-12-21 08:13 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | + | |
| 7 | + | |
| 8 | +class Migration(migrations.Migration): | |
| 9 | + | |
| 10 | + dependencies = [ | |
| 11 | +        ('member', '0013_goodsinfo_only_for_member'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.DeleteModel( | |
| 16 | + name='CouponInfo', | |
| 17 | + ), | |
| 18 | + migrations.RemoveField( | |
| 19 | + model_name='rightinfo', | |
| 20 | + name='coupon_detail', | |
| 21 | + ), | |
| 22 | + migrations.RemoveField( | |
| 23 | + model_name='rightinfo', | |
| 24 | + name='coupon_id', | |
| 25 | + ), | |
| 26 | + migrations.RemoveField( | |
| 27 | + model_name='rightinfo', | |
| 28 | + name='coupon_level1_amount', | |
| 29 | + ), | |
| 30 | + migrations.RemoveField( | |
| 31 | + model_name='rightinfo', | |
| 32 | + name='coupon_level2_amount', | |
| 33 | + ), | |
| 34 | + migrations.RemoveField( | |
| 35 | + model_name='rightinfo', | |
| 36 | + name='coupon_level3_amount', | |
| 37 | + ), | |
| 38 | + migrations.RemoveField( | |
| 39 | + model_name='rightinfo', | |
| 40 | + name='coupon_level4_amount', | |
| 41 | + ), | |
| 42 | + migrations.RemoveField( | |
| 43 | + model_name='rightinfo', | |
| 44 | + name='coupon_level5_amount', | |
| 45 | + ), | |
| 46 | + migrations.RemoveField( | |
| 47 | + model_name='rightinfo', | |
| 48 | + name='coupon_valid_period', | |
| 49 | + ), | |
| 50 | + migrations.AddField( | |
| 51 | + model_name='goodsinfo', | |
| 52 | + name='coupon_id', | |
| 53 | + field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_id'), | |
| 54 | + ), | |
| 55 | + migrations.AddField( | |
| 56 | + model_name='goodsinfo', | |
| 57 | + name='left_num', | |
| 58 | + field=models.IntegerField(default=0, help_text='\u5546\u54c1\u5e93\u5b58', verbose_name='left_num'), | |
| 59 | + ), | |
| 60 | + migrations.AddField( | |
| 61 | + model_name='goodsinfo', | |
| 62 | + name='value', | |
| 63 | + field=models.IntegerField(default=99999, help_text='\u5546\u54c1\u4ef7\u503c\uff0c\u5355\u4f4d\u5206', verbose_name='value'), | |
| 64 | + ), | |
| 65 | + migrations.AddField( | |
| 66 | + model_name='rightinfo', | |
| 67 | + name='coupon_level1_id', | |
| 68 | + field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_level1_id'), | |
| 69 | + ), | |
| 70 | + migrations.AddField( | |
| 71 | + model_name='rightinfo', | |
| 72 | + name='coupon_level2_id', | |
| 73 | + field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_level2_id'), | |
| 74 | + ), | |
| 75 | + migrations.AddField( | |
| 76 | + model_name='rightinfo', | |
| 77 | + name='coupon_level3_id', | |
| 78 | + field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_level3_id'), | |
| 79 | + ), | |
| 80 | + migrations.AddField( | |
| 81 | + model_name='rightinfo', | |
| 82 | + name='coupon_level4_id', | |
| 83 | + field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_level4_id'), | |
| 84 | + ), | |
| 85 | + migrations.AddField( | |
| 86 | + model_name='rightinfo', | |
| 87 | + name='coupon_level5_id', | |
| 88 | + field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_level5_id'), | |
| 89 | + ), | |
| 90 | + ] | 
| @@ -27,9 +27,13 @@ class GoodsInfo(BaseModelMixin): | ||
| 27 | 27 |  | 
| 28 | 28 | title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'商品名称') | 
| 29 | 29 | desc = RichTextField(_(u'desc'), blank=True, null=True, help_text=u'商品描述') | 
| 30 | + value = models.IntegerField(_(u'value'), default=99999, help_text=u'商品价值,单位分') | |
| 31 | + left_num = models.IntegerField(_(u'left_num'), default=0, help_text=u'商品库存') | |
| 30 | 32 |  | 
| 31 | 33 | image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'商品图片') | 
| 32 | 34 |  | 
| 35 | + coupon_id = models.CharField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) | |
| 36 | + | |
| 33 | 37 | is_slider = models.BooleanField(_(u'is_slider'), default=True, help_text=u'是否为轮播商品', db_index=True) | 
| 34 | 38 | slider_image = models.ImageField(_(u'slider_image'), upload_to=upload_path, blank=True, null=True, help_text=u'商品轮播图片') | 
| 35 | 39 |  | 
| @@ -164,17 +168,12 @@ class RightInfo(BaseModelMixin): | ||
| 164 | 168 |  | 
| 165 | 169 | # 券相关 | 
| 166 | 170 | is_send_coupon = models.BooleanField(_(u'is_send_coupon'), default=False, help_text=_(u'是否发券'), db_index=True) | 
| 167 | - | |
| 168 | - coupon_id = models.CharField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) | |
| 169 | - | |
| 170 | - coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)')) | |
| 171 | 171 | coupon_num = models.IntegerField(_(u'coupon_num'), default=0, help_text=_(u'券每会员级别发放张数')) | 
| 172 | - coupon_level1_amount = models.IntegerField(_(u'coupon_level1_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 173 | - coupon_level2_amount = models.IntegerField(_(u'coupon_level2_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 174 | - coupon_level3_amount = models.IntegerField(_(u'coupon_level3_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 175 | - coupon_level4_amount = models.IntegerField(_(u'coupon_level4_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 176 | - coupon_level5_amount = models.IntegerField(_(u'coupon_level5_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 177 | - coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') | |
| 172 | + coupon_level1_id = models.CharField(_(u'coupon_level1_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) | |
| 173 | + coupon_level2_id = models.CharField(_(u'coupon_level2_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) | |
| 174 | + coupon_level3_id = models.CharField(_(u'coupon_level3_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) | |
| 175 | + coupon_level4_id = models.CharField(_(u'coupon_level4_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) | |
| 176 | + coupon_level5_id = models.CharField(_(u'coupon_level5_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) | |
| 178 | 177 |  | 
| 179 | 178 | class Meta: | 
| 180 | 179 | verbose_name = _(u'会员权益信息') | 
| @@ -212,78 +211,6 @@ class RightInfo(BaseModelMixin): | ||
| 212 | 211 | } | 
| 213 | 212 |  | 
| 214 | 213 |  | 
| 215 | -class CouponInfo(BaseModelMixin): | |
| 216 | - PHYSICAL = 0 | |
| 217 | - VIRTUAL = 1 | |
| 218 | - COUPON = 2 | |
| 219 | - | |
| 220 | - RIGHT_TYPE_TUPLE = ( | |
| 221 | - (PHYSICAL, u'实物'), | |
| 222 | - (VIRTUAL, u'虚拟'), | |
| 223 | - (COUPON, u'优惠券'), | |
| 224 | - ) | |
| 225 | - | |
| 226 | - brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 227 | - brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 228 | - | |
| 229 | - coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True) | |
| 230 | - user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) | |
| 231 | - | |
| 232 | - coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)')) | |
| 233 | - coupon_amount = models.IntegerField(_(u'coupon_amount'), default=0, blank=True, null=True, help_text=u'券金额(单位:分)') | |
| 234 | - coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') | |
| 235 | - | |
| 236 | - active_at = models.DateTimeField(_(u'active_at'), blank=True, null=True, help_text=_(u'生效时间')) | |
| 237 | - expire_at = models.DateTimeField(_(u'expire_at'), blank=True, null=True, help_text=_(u'过期时间')) | |
| 238 | - | |
| 239 | - right_id = models.CharField(_(u'right_id'), max_length=32, blank=True, null=True, help_text=u'权益唯一标识', db_index=True) | |
| 240 | - right_type = models.IntegerField(_(u'right_type'), choices=RIGHT_TYPE_TUPLE, default=VIRTUAL, help_text=u'权益类型', db_index=True) | |
| 241 | - | |
| 242 | - icon = models.ImageField(_(u'icon'), upload_to=upload_path, blank=True, null=True, help_text=u'权益图标') | |
| 243 | - title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'权益名称') | |
| 244 | - subtitle = models.CharField(_(u'subtitle'), max_length=255, blank=True, null=True, help_text=u'权益二级名称') | |
| 245 | - detail = RichTextField(_(u'detail'), blank=True, null=True, help_text=u'权益详情') | |
| 246 | - | |
| 247 | - has_used = models.BooleanField(_(u'has_used'), default=False, help_text=u'是否已核销', db_index=True) | |
| 248 | - admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True) | |
| 249 | - used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=u'维修券核销时间') | |
| 250 | - | |
| 251 | - class Meta: | |
| 252 | - verbose_name = _(u'会员券信息') | |
| 253 | - verbose_name_plural = _(u'会员券信息') | |
| 254 | - | |
| 255 | - def __unicode__(self): | |
| 256 | - return unicode(self.pk) | |
| 257 | - | |
| 258 | - @property | |
| 259 | - def icon_path(self): | |
| 260 | - return upload_file_path(self.icon) | |
| 261 | - | |
| 262 | - @property | |
| 263 | - def icon_url(self): | |
| 264 | - return upload_file_url(self.icon) | |
| 265 | - | |
| 266 | - @property | |
| 267 | - def data(self): | |
| 268 | -        return { | |
| 269 | - 'coupon_id': self.coupon_id, | |
| 270 | - 'coupon_valid_period': self.coupon_valid_period, | |
| 271 | - 'coupon_amount': self.coupon_amount, | |
| 272 | - 'coupon_detail': self.coupon_detail, | |
| 273 | - 'active_at': tc.local_string(self.active_at, format='%Y%m%d'), | |
| 274 | - 'expire_at': tc.local_string(self.expire_at, format='%Y%m%d'), | |
| 275 | - 'right_id': self.right_id, | |
| 276 | - 'right_type': self.right_type, | |
| 277 | - 'icon': self.icon_url, | |
| 278 | - 'title': self.title, | |
| 279 | - 'subtitle': self.subtitle, | |
| 280 | - 'detail': self.detail, | |
| 281 | - 'has_used': self.has_used, | |
| 282 | - 'admin_id': self.admin_id, | |
| 283 | - 'used_at': self.used_at, | |
| 284 | - } | |
| 285 | - | |
| 286 | - | |
| 287 | 214 | class ShotTypeInfo(BaseModelMixin): | 
| 288 | 215 | brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | 
| 289 | 216 | brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') |